// abstract class Animal { // 抽象类
//     name: string
//     constructor(name:string){
//         this.name = name
//     }
//     getName():string{
//         return this.name
//     }
// }
// 抽象类不能直接被实例化 
// let dog = new Animal('二哈');
// console.log(dog);

// class Dog extends Animal {
//     constructor(name:string){
//         super(name)
//     }
// }

// let d = new Dog('二哈');


// console.log(d);


// 抽象方法
//1. 抽象方法不能脱离抽象类使用 
//2. 抽象方法不能有具体的实现 （简单的理解，抽象方法不能有逻辑代码）
// abstract function name(params:type) {
    
// }

// abstract class Animal { // 抽象类
//     name: string
//     constructor(name:string){
//         this.name = name
//     }
//     abstract eat():string // 抽象方法
// }


// class Dog extends Animal {
//   constructor(name:string){
//      super(name)
//   }
//   eat():string{
//     return this.name + '喜欢吃屎！'
//   }
// }

// let d = new Dog('泰迪');
// console.log(d);


// 接口描述对象的时候，属性是不允许多，或者少，再或者不写的。
// interface Iobj {
//   name: string,
//   age: number
// }

// let obj:Iobj = {
//   name: '张三',
//   age: 18
// }


// // 使用接口来约束类 类的属性和方法，是允许多的。
// interface IAnimal {
//     name: string
//     eat():string
// }

// class Animal implements IAnimal { 
//     name: string;
//     age: number
//     constructor(name:string,age:number){
//         this.name = name;
//         this.age = age;
//     }
//     eat():string{
//       return this.name + '喜欢吃鱼！'
//     }
// }


// let c = new Animal('cat',2);

// console.log(c);



// 接口的继承
interface Ianimal { // 接口
    name: string
}


interface IPeople extends Ianimal {
    work():void
}


let obj:IPeople = {
    work:()=>{

    },
    name:'张三'
}
console.log(obj);


class Coder implements IPeople {
    name: string
    constructor(name:string){
        this.name = name
    }
    work(): void {
        
    }
}
